package com.autumn.annotations.run;

import com.autumn.xa.common.util.FrameworkUtils;
import com.autumn.annotations.ioclife.config.IocLifeDemoConfig;
import com.autumn.annotations.value.config.ProfileDemoConfig;
import com.autumn.annotations.value.config.ValueDemoConfig;
import com.autumn.annotations.value.value.Person;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * ClassName: ValueRun
 *
 * @Description:
 * @Author: wangqiuyang
 * @Date: 2022/1/26 10:16 上午
 * History:
 * <author>          <time>          <version>          <desc>
 * wangqiuyang    2022/1/26 10:16 上午   @Version 1.0        描述
 */
public class ValueRun {

    /**
     * Description: @value 使用
     * @param
     * @return: void
     * @author: wangqiuyang
     * @Date: 2022/1/25 2:42 下午
     */
    @Test
    public void valueDemo () {
        AnnotationConfigApplicationContext contxt = new AnnotationConfigApplicationContext(ValueDemoConfig.class);
        System.out.println("ioc 初始化完成 ......");

        // 输出所有的bean名字
        FrameworkUtils.printAllBeanNames(contxt);

        Person perosn = (Person)contxt.getBean("person");

        System.out.println(perosn.toString());

        /*
            @value的用法
            1。 @Value("值")   里面直接输入值
            2。 @Value("#{2*6}")  SpEl 表达式
            3。 @Value("${a.b.c}") 取配置文件

            使用配置文件 需要在@configuration注解上面加一个注解 @PropertySource(value = "classpath:/value.peoperties") 指定一个配置文件或多个配置文件

        */

        // 关闭容器
        System.out.println("ioc 容器开始关闭 ......");
        contxt.close();
        System.out.println("ioc 容器关闭完成 ......");
    }


    /**
     * Description: autowired 自动装配
     * @param
     * @return: void
     * @author: wangqiuyang
     * @Date: 2022/1/25 2:42 下午
     */
    @Test
    public void autowireDemo () {
        AnnotationConfigApplicationContext contxt = new AnnotationConfigApplicationContext(ValueDemoConfig.class);
        System.out.println("ioc 初始化完成 ......");

        // 输出所有的bean名字
        FrameworkUtils.printAllBeanNames(contxt);


        /*
            @autowired的用法
            1。 按照类型进行注入 ， 如果找到了多个类型会按照 属性的name进行匹配（注解标注的属性的名字） （新版本会报错）
            2。 使用@Qualifier("id") 可以指定bean的id 进行装配
            3。 如果想 有就装配 没有就不装配 则可以设置 @Autowired(required = false) 非必需
            4。 使用 @Primary 来标注bean时候  使用@autowired 装配对象的时候 默认使用@Primary修饰的bean来装配 ， @Primary 和 @Qualifier 注解不能同时使用

            5。 @qualifier 和 @autowired 一同修饰属性变量  ｜｜ @Primary 修饰@bean/@component/等（组件）

            6。 JSR250 @Resource (不能与spring的注解一起使用)    JSR330 @Inject / 可以和spring注解使用   但是要倒入包

            7。 autowired 可以修饰在方法上 和 类构造器上  装配方法中的参数
        */

        // 关闭容器
        System.out.println("ioc 容器开始关闭 ......");
        contxt.close();
        System.out.println("ioc 容器关闭完成 ......");
    }

    /**
     * Description: @profile 根据环境选择注入的bean
     * @param
     * @return: void
     * @author: wangqiuyang
     * @Date: 2022/1/25 2:42 下午
     */
    @Test
    public void profileDemo () {
        AnnotationConfigApplicationContext contxt = new AnnotationConfigApplicationContext();

        contxt.getEnvironment().setActiveProfiles("fat");
        contxt.register(ProfileDemoConfig.class);
        contxt.refresh();

        System.out.println("ioc 初始化完成 ......");

        // 输出所有的bean名字
        FrameworkUtils.printAllBeanNames(contxt);


        /*
            @Profile
            1。 加在@bean上 标识在某个环境中才注入这个bean
            2。 加在@configuration上 表示在某个环境中才加载这个config 不管它里面的bean是否加了profile
            3。 约束规则 类 > 属性
            4. 如果@profile取值为default 就代表默认加载这个 不区分 环境

            5。 -Dspring.profiles.active=dev
            6。 使用如上方法 修改env
        */

        // 关闭容器
        System.out.println("ioc 容器开始关闭 ......");
        contxt.close();
        System.out.println("ioc 容器关闭完成 ......");
    }
}
